#include "../logs/bitlog.h"
#include <unistd.h>


void test_log(const std::string &name) {
    bitlog::Logger::ptr logger = bitlog::LoggerManager::getInstance().getLogger(name);
    INFO("%s", "测试开始！");
    logger->debug("%s", "测试日志");
    logger->info("%s", "测试日志");
    logger->warn("%s", "测试日志");
    logger->error("%s", "测试日志");
    logger->fatal("%s", "测试日志");
    INFO("%s", "测试完毕！");
}

int main() {
    // 创建一个LoggerBuilder的智能指针，用于构建日志对象
    std::unique_ptr<bitlog::LoggerBuilder> builder(new bitlog::GlobalLoggerBuilder);
    builder->buildLoggerName("async_logger");// 设置日志对象的名称为"async_logger"
    builder->buildLoggerLevel(bitlog::LogLevel::value::DEBUG);// 设置日志对象的日志级别为WARN
    builder->buildFormatter("[%d{%H:%M:%S}][%t][%p][%c][%f:%l]%T%m%n");// 设置日志对象的日志格式
    builder->buildLoggerType(bitlog::LoggerType::LOGGER_SYNC);// 设置日志对象的类型为同步日志
    builder->buildSink<bitlog::StdoutSink>();// 为日志对象添加一个标准输出类型的Sink
    builder->buildSink<bitlog::FileSink>("./logfile/sync.log");
    builder->buildSink<bitlog::RollBySizeSink>("./logfile/roll-sync-by-size", 1024 * 1024);
    builder->build();// 构建并获取日志对象的智能指针

    test_log("async_logger");

    return 0;
}

/* 异步日志测试*/
// int main() {
//     // 创建一个LoggerBuilder的智能指针，用于构建日志对象
//     std::unique_ptr<bitlog::LoggerBuilder> builder(new bitlog::LocalLoggerBuilder);
//     builder->buildLoggerName("async_logger");// 设置日志对象的名称为"async_logger"
//     builder->buildLoggerLevel(bitlog::LogLevel::value::WARN);// 设置日志对象的日志级别为WARN
//     builder->buildFormatter("[%c] %T%m%n");// 设置日志对象的日志格式
//     builder->buildLoggerType(bitlog::LoggerType::LOGGER_ASYNC);// 设置日志对象的类型为异步日志
//     builder->buildEnableUnSafeAsync(); // 启用非安全异步日志
//     builder->buildSink<bitlog::StdoutSink>();// 为日志对象添加一个标准输出类型的Sink
//     builder->buildSink<bitlog::FileSink>("./logfile/async.log");
//     bitlog::Logger::ptr logger = builder->build();// 构建并获取日志对象的智能指针

//     // 记录不同级别的日志
//     logger->debug(__FILE__, __LINE__, "%s", "测试日志");
//     logger->info(__FILE__, __LINE__, "%s", "测试日志");
//     logger->warn(__FILE__, __LINE__, "%s", "测试日志");
//     logger->error(__FILE__, __LINE__, "%s", "测试日志");
//     logger->fatal(__FILE__, __LINE__, "%s", "测试日志");

//     // 循环记录大量日志，触发日志滚动
//     size_t count = 0;
//     while (count < 500000) {
//         logger->fatal(__FILE__, __LINE__, "测试日志-%d", count++);
//     }

//     return 0;
// }


/*/ 缓冲区测试*/
// int main() {
//     // 读取文件数据，一点一点写入缓冲区，最终将缓冲区数据写入文件，判断生成的新文件与源文件是否一致
//     std::ifstream ifs("./logfile/test.log", std::ios::binary);
//     if (ifs.is_open() == false) { return -1; }
//     ifs.seekg(0, std::ios::end); // 移动文件指针到文件末尾,获取文件大小
//     size_t fsize = ifs.tellg(); // 获取当前读写位置相对于起始位置的偏移量
//     ifs.seekg(0, std::ios::beg); // 重新移动文件指针到文件起始位置

//     std::string body;
//     body.resize(fsize);
//     ifs.read(&body[0], fsize); // 从文件中读取数据到 body 中
//     if (ifs.good() == false) { std::cout << "ifs read error\n"; return -1; }
//     ifs.close();

//     std::cout << fsize << std::endl;
//     bitlog::Buffer buffer;
//     for (int i = 0; i < body.size(); ++i) {
//         buffer.push(&body[i], 1); // 将数据写入缓冲区
//     }
//     std::cout << buffer.readAbleSize() << std::endl;

//     std::ofstream ofs("./logfile/tmp.log", std::ios::binary);
//     // ofs.write(buffer.begin(), buffer.readAbleSize());
//     size_t rsize = buffer.readAbleSize();
//     for (int i = 0; i < rsize; ++i) {
//         ofs.write(buffer.begin(), 1); // 将缓冲区中的数据写入文件
//         if (ofs.good() == false) { std::cout << "ofs write error\n"; return -1; }
//         buffer.moveReaderIdx(1);
//     }
//     if (ofs.good() == false) { std::cout << "ofs write error\n"; return -1; }
//     ofs.close();

//     return 0;
// }

/* 日志构建器测试*/
// int main()
// {
//     // 创建一个LoggerBuilder的智能指针，用于构建日志对象
//     std::unique_ptr<bitlog::LoggerBuilder> builder(new bitlog::LocalLoggerBuilder);

//     builder->buildLoggerName("sync_logger");// 设置日志对象的名称为"sync_logger"
//     builder->buildLoggerLevel(bitlog::LogLevel::value::WARN);// 设置日志对象的日志级别为WARN
//     builder->buildFormatter("%d{%H:%M:%S} [%p] [%c] [%f:%l] %T%m%n");// 设置日志对象的日志格式
//     builder->buildLoggerType(bitlog::LoggerType::LOGGER_SYNC);// 设置日志对象的类型为同步日志
//     builder->buildSink<bitlog::StdoutSink>();// 为日志对象添加一个标准输出类型的Sink
//     // 为日志对象添加一个文件输出类型的Sink，指定日志文件的路径
//     builder->buildSink<bitlog::FileSink>("./logfile/test.log");

//     bitlog::Logger::ptr logger = builder->build();// 构建并获取日志对象的智能指针

//     // 记录不同级别的日志
//     logger->debug(__FILE__, __LINE__, "%s", "测试日志");
//     logger->info(__FILE__, __LINE__, "%s", "测试日志");
//     logger->warn(__FILE__, __LINE__, "%s", "测试日志");
//     logger->error(__FILE__, __LINE__, "%s", "测试日志");
//     logger->fatal(__FILE__, __LINE__, "%s", "测试日志");

//     // 循环记录大量日志，触发日志滚动
//     size_t cursize = 0, count = 0;
//     while (cursize < 1024 * 1024 * 10)
//     {
//         logger->fatal(__FILE__, __LINE__, "测试日志-%d", count++);
//         cursize += 20;
//     }

//     return 0;
// }

/* 同步日志器测试*/
// int main()
// {
//     // 设置日志器名称
//     std::string logger_name = "sync_logger";
//     // 设置日志级别为 WARN
//     bitlog::LogLevel::value limit = bitlog::LogLevel::value::WARN;
//     // 创建日志格式化器
//     bitlog::Formatter::ptr fmt(new bitlog::Formatter("%d{%H:%M:%S} [%p] [%c] [%f:%l] %T%m%n"));
//     // 创建标准输出日志接收器
//     bitlog::LogSink::ptr stdout_lsp = bitlog::SinkFactory::create<bitlog::StdoutSink>();
//     // 创建文件日志接收器
//     bitlog::LogSink::ptr file_lsp = bitlog::SinkFactory::create<bitlog::FileSink>("./logfile/test.log");
//     // 创建按大小滚动的日志接收器
//     bitlog::LogSink::ptr roll_lsp = bitlog::SinkFactory::create<bitlog::RollBySizeSink>("./logfile/roll-", 1024 * 1024 * 10);
//     // 将所有日志接收器放入一个容器中
//     std::vector<bitlog::LogSink::ptr> sinks = {stdout_lsp, file_lsp, roll_lsp};

//     // 创建同步日志器实例
//     bitlog::Logger::ptr logger(new bitlog::SyncLogger(logger_name, limit, fmt, sinks));

//     // 记录不同级别的日志
//     logger->debug(__FILE__, __LINE__, "%s", "测试日志");
//     logger->info(__FILE__, __LINE__, "%s", "测试日志");
//     logger->warn(__FILE__, __LINE__, "%s", "测试日志");
//     logger->error(__FILE__, __LINE__, "%s", "测试日志");
//     logger->fatal(__FILE__, __LINE__, "%s", "测试日志");

//     循环记录大量日志，触发日志滚动
//     size_t cursize = 0, count = 0;
//     while (cursize < 1024 * 1024 * 10)
//     {
//         logger->fatal(__FILE__, __LINE__, "测试日志-%d", count++);
//         cursize += 20;
//     }

//     return 0;
// }

/* 日志滚动测试*/
// int main()
// {
// bitlog::LogMsg msg(bitlog::LogLevel::value::INFO, 53, "main.c", "root", "格式化功能测试...");
// bitlog::Formatter fmt;
// std::string str = fmt.format(msg);
// bitlog::LogSink::ptr stdout_lsp = bitlog::SinkFactory::create<bitlog::StdoutSink>();
// bitlog::LogSink::ptr file_lsp = bitlog::SinkFactory::create<bitlog::FileSink>("./logfile/test.log");
// bitlog::LogSink::ptr roll_lsp = bitlog::SinkFactory::create<bitlog::RollBySizeSink>("./logfile/roll-", 1024 * 1024 * 10);
// bitlog::LogSink::ptr time_lsp = bitlog::SinkFactory::create<bitlog::RollByTimeSink>("./logfile/roll-", bitlog::TimeGap::GAP_SECOND);

// stdout_lsp->log(str.c_str(), str.size());
// file_lsp->log(str.c_str(), str.size());
// size_t cursize = 0;
// size_t count = 0;
// while (cursize < 1024 * 1024 * 10)
// {
//     std::string tmp = std::to_string(count++) + str;
//     roll_lsp->log(tmp.c_str(), tmp.size());
//     cursize += tmp.size();
// }

// time_t old = bitlog::util::Date::now();
// while (bitlog::util::Date::now()  < old + 5)
// {
//     time_lsp->log(str.c_str(), str.size());
//     usleep(1000000);
// }

//     return 0;
// }
